<?php
/** 
*基础控制器负责登录，权限验证，以及常规的查询、删除数据库记录等
* 
* @author      tangchuan
*/
require_once ('models/Powers.php');
require_once ('models/Users.php');
class BaseController extends AbstractController{

		
   
    /**
     * 重载基类中的beforeInvoke方法用来判断当前用户是否登录，是否有权限访问当前url     
     * @param $actionName    控制器名称
     * @param $method        被调用的方法名称
     * @param $invokeParams  被执行的实参数组
     */
    public function  beforeInvoke($actionName,$method,$invokeParams){
        $methodName = $method->name;
        $url = $_SERVER["PHP_SELF"];
        if(strstr(strtolower($methodName),"login")==false ){
            if(empty($_SESSION["username"])) {
                throw new CustomerException("请先登录",3);
            }
        }

        $fullPowers = Powers::getAllAvailablePowers();            
        $url = $actionName."!".$methodName;
        if(array_key_exists($url,$fullPowers) ){
             $power = $fullPowers[$url];
             if(!Users::HavePermission($power)){
                 throw new CustomerException("您没有该操作权限，请联系管理员！",4);
             }
        }
        parent::beforeInvoke($actionName,$method,$invokeParams);
    }
    
    
    
    /**
     * 根据模型名称查询对应的模型列表
     * @param $filter      过滤条件
     * @param $state       以对应的state作为过滤条件
     * @param $className   需要查询的模型类名默认为当前的$this->_className制定的类名
     * @param $orderBy     排序规则 （非必填）
     * @param $pagesize    分页尺寸默认为20 （非必填）
     * @param $loadChild   是否自动加载从表 （非必填）
     * @return 返回符合查询条件的模型列表
     */
    public function getEntityList($filter =null,$state = null,$className="",$orderBy="",$pagesize = 20,$loadChild=false){
        if($state!=null){
            if($filter == null){
                $filter = new SqlFilter();
            }
            $filter->addFilter("state",EQUALS,$state);           
        }
        if($className== null || $className == ""){
            $className = $this->_className;
        }
        
        return Page::FetchPageJson($className,$filter,$orderBy,$loadChild,null,$pagesize);  
    }


    /**
     * 根据模型名称查询对应的模型列表
     * @param $className   需要查询的模型类名默认为当前的$this->_className制定的类名
     * @param $filter      过滤条件
     * @param $orderBy     排序规则 （非必填）
     * @param $pagesize    分页尺寸默认为全部加载 （非必填）
     * @param $loadChild   是否自动加载从表 （非必填）
     * @return 返回符合查询条件的模型列表
     */
    public function getBeanList($className="",$filter =null,$orderBy="",$pagesize = 0,$loadChild=false){
        if($className== null || $className == ""){
            $className = $this->_className;
        }
        return AbstractBean::getBeanList($className,$filter,$orderBy,$pagesize,$loadChild);     
    }




    /**
     * 根据主键值加载对应模型的记录
     * @param $id  主键值
     * @param $loadChild   是否自动加载从表 （非必填）
     * @param $className   需要查询的模型类名默认为当前的$this->_className制定的类名
     * @return 返回根据主键值加载的记录
     */
    public function getEntityByid($id,$loadChild = false,$className=null){
        if($className==null || $className==""){
            $className =$this->_className;
        }
        return AbstractBean::LoadBean($className,$id,$loadChild);
    }

    /**
     * 根据主键值删除对应模型的记录
     * @param $id  主键值
     * @param $className   需要查询的模型类名默认为当前的$this->_className制定的类名
     * @return 返回根据主键值加载的记录
     */
    public function delete($id,$className=null){
            $this->_bean = $this->getEntityByid($id,false,$className);
            $this->_bean->deleteItem();
    }

    public function switchState($id,$state){
        if($this->_bean==null && $this->_className!=null && $this->_className!=""){
            $this->_bean = AbstractBean::LoadBean($this->_className);
        }
        $this->_bean->set("id",$id);
        $this->_bean->set("state",$state);
        $this->_bean->update();
    }

    protected function beforeSave($post_json = null,$className = ""){
        if($className== null || $className == ""){
            $className = $this->_className;
        }

        if($this->_bean == null && $className!=null && $className!=""){
            $this->_bean =  AbstractBean::LoadBean($className);
        }

        if($this->_bean == null){
             throw new CustomerException("Please set the _className!", -10);
        }
        
        if($post_json==null ){
              Utils::FillBean($className,$this->_bean);
        }
        else{
            $this->_bean = $this->getPostEntity($post_json,$className);
        }
    }

     /**
     * 保存客户端提交的数据
     * @param $post_json  客户端以Raw形式提交的数据
     * @param $transaction 开启事物固定为null
     * @param $className  需要查询的模型类名默认为当前的$this->_className制定的类名
     * @return 包含提交数据的模型实例
     */
    public function save($post_json = null,$transaction = null,$className = ""){
        $_isNew = true;
        $this->beforeSave($post_json,$className);
        $_isNew = $this->_bean->isNew();        
		$this->_bean ->save();
	    return $_isNew ;			    
    }

    /**
     * 把客户端提交的Raw记录填充到一个模型对象
     * @param $post_json  客户端以Raw形式提交的数据
     * @param $className  需要查询的模型类名默认为当前的$this->_className制定的类名
     */
    public function getPostEntity($post_json = null,$className = ""){
        if($className == ""){
            $className = $this->_className;
        }
        return AbstractBean::ConvertJson2Bean($post_json,$className);
    }


     

     


   

}
?>